\documentclass{article}
\usepackage{CJK}
\begin{CJK}{UTF8}{gbsn}
\title{Python简单解释器 设计文档}
\author{2011011278 计14 武祥晋}
\begin{document}
\maketitle
\section{概况}
这一通过C++实现的Python简单解释器，支持命令行即时解释运行与解释py文件两种模式。

数据类型：支持整数类型的赋值、加减乘除、输出，不支持长整数、括号、一元运算（正负号）；支持整数作为布尔值、True、False、整数的比较运算，不支持括号、and/or/not；支持字面字符串（单引号、双引号）的输出。

语句与控制结构：支持赋值、输出、纯表达式、if/else、while/break，支持后两者的嵌套，支持注释，不支持elif、continue、for，不支持while/else。

程序并未按照“词法分析-语法分析-执行”的方式解释，而是同时进行。
\section{结构设计}
Context类：
	负责源代码的输入、程序信息的输出。单件

Value类：
	抽象“数据”类，为支持增加其他数据类型留下接口。

	ValueInt类：
		整数类型类，定义了整数的加减乘除、赋值、比较、输出。

VarTable类：
	变量表，负责变量的定义、查找，会检查变量名是否合法。单件

Token类：
	名称属于误用，不是词法分析中的Token，而是语法树中的抽象节点类。

	TokenInt类：
		处理单个整数，字面整数或者整数变量。

		TokenIntMul类：
			处理仅包含乘除的整数表达式，组合有1个TokenIntMul和1个TokenInt。

		TokenIntExp类：
			处理整数表达式，目前只支持加减乘除，组合有1个TokenIntExp和1个TokenIntMul。

	TokenBool类：
		处理单个布尔量，True、False或者整数表达式。

		TokenBoolCmp类：
			处理由两个整数表达式与比较运算符构成的布尔表达式或单个布尔量，组合有2个TokenIntExp或1个TokenBool。

		TokenBoolExp类：
			处理布尔表达式，目前只支持TokenBoolCmp类，组合有1个TokenBoolCmp。
	
	TokenBlock类：
		语句块类，负责缩进的判断与检查，组合有若干个TokenSen。

	TokenSen类：
		语句类，决定当前行是哪一种具体的语句，组合有1个TokenSen的子类。

		TokenSenAssign类：
			赋值语句类，变量赋值，组合有1个TokenIntExp。

		TokenSenPrint类：
			输出语句类，输出整数表达式或字面字符串，组合有1个TokenIntExp。

		TokenSenIf类：
			条件语句类，组合有1个TokenBoolExp和1个或2个TokenBlock。

		TokenSenWhile类：
			循环语句类，组合有1个TokenBoolExp和1个TokenBlock。
	
Error类：
	错误类，负责错误信息的传递与显示。
	
	ErrorBreak类：
		实现break，未被TokenSenWhile捕获则显示为“Unexpected break”。
		
	ErrorExit类：
		实现源文件结束时程序退出。

main函数：
	初始化和终止化Context和VarTable，组合一个根TokenBlock，显示捕获到的错误。
\section{灵活性与扩展性}
程序的输入输出由Context类负责，便于处理某些细节，如Windows、Linux、Mac的不同回车和换行符问题。

变量表VarTable可以存储Value类的其他子类，方便扩展数据类型。

可以在TokenIntExp和TokenIntMul之间、在TokenBoolExp和TokenBoolCmp之间插入新的Proxy类，以支持含有正负号、括号、幂的整数表达式和含有括号、逻辑运算的布尔表达式。

可以从TokenSen继承新的子类，增加新的语句类型。

可以通过对Error的继承实现continue。
\section{待完善}
未采用“词法分析-语法分析-执行”的方式解释，在语法错误分析上可能存在偏差，存在一条语句或表达式重复分析而效率不高的情况。

表达式树的结构可能深度过大，但是比手工栈计算易于扩展，需要进一步权衡。

具体语句种类的判断应该交由专门的类判断，不应该由抽象语句类TokenSen来完成。

如果将来要支持函数定义，VarTable将不能为单件。
\end{CJK}
\end{document}

